from flask_wtf import DataRequired
from flask_wtf import Length
from flask_wtf import ValidationError 
from flask_wtf import Regexp
from flask import flash

import re

class Required(DataRequired):
    """
    Clase que redefine la clase required a fin de poder modificar
    sus atributos por defecto
    """
    def __init__(self, message="Este campo es obligatorio"):
        super(Required, self).__init__(message)
        
    def __call__(self, form, field):
        print "Validando" 
        print form
        super(Required, self).__call__(form, field)
        
   
class Length(object):
    """
    Clase que redefine la clase length a fin de poder modificar sus
    atributos por defecto
    """
    def __init__(self, min=-1, max=-1, message=None):
        assert min != -1 or max!=-1, 'Se debe especificar al menos `min` o `max` .'
        assert max == -1 or min <= max, '`min` no puede ser mayor a `max`.'
        self.min = min
        self.max = max
        self.message = message

    def __call__(self, form, field):
        l = field.data and len(field.data) or 0
        if l < self.min or self.max != -1 and l > self.max:
            if self.message is None:
                if self.max == -1:
                    self.message = field.ngettext('El campo debe tener al menos %(min)d caracteres de longitud.',
                                                  'El campo debe tener al menos %(min)d caracteres de longitud.', self.min)
                elif self.min == -1:
                    self.message = field.ngettext('El campo debe tener como maximo %(max)d caracteres de longitud.',
                                                  'El campo debe tener como maximo %(max)d caracteres de longitud.', self.max)
                else:
                    self.message = field.gettext('El campo debe tener entre %(min)d y %(max)d caracteres de longitud.')

            raise ValidationError(self.message % dict(min=self.min, max=self.max))
        
length = Length


class Email(Regexp):
    """
    Clase que redefine la clase Email con el fin de poder modificar sus atributos por
    defecto
    """
    def __init__(self, message=None):
        super(Email, self).__init__(r'^.+@[^.].*\.[a-z]{2,10}$', re.IGNORECASE, message)

    def __call__(self, form, field):
        if self.message is None:
            self.message = field.gettext('Direccion de e-mail invalida.')

        super(Email, self).__call__(form, field)

class Fecha(object):
    
    def __init__(self, message = None):
        self.message = message
    
    def __call__(self, form, field):
        
        meses = [31, 28, 31, 30, 31, 30, 31, 31, 30, 31]
       
        if (field.data != None and field.data != ''):
            partes = field.data.split('/')
        
            if (len(partes) == 3):       
        
                anho = int(partes[2])
                mes = int(partes[1])
                dias = int(partes[0])
            
                if( anho % 4 == 0 and anho % 100 !=0 or anho % 400 ==0):
                    meses[1] = 29
                    if(mes > 0 and mes < 12):    
                        if((meses[mes] < dias and dias <0)):
                            self.message = field.gettext('Fecha no valida')
                            raise ValidationError(self.message )
                    else:
                        self.message = field.gettext('Fecha no valida')
                        raise ValidationError(self.message )
            else: 
                self.message = field.gettext('Fecha no valida')
        
                raise ValidationError(self.message )
        
        